/********************************************************************************
  * @file    SD93F115B_saradc.c
  * @author   TEST TEAM 												    	
  * @version  v0															    	
  * @date     Septemper 2022												    	
  * @brief
  *
  * Copyright (C) 2022  Hangzhou SDIC Microelectronics Co., Ltd
*********************************************************************************/

/* Includes */
    
#include "SD93F115B_saradc.h"
#include "SD93F115B_rcc.h"

/*--------------------------------------------
 * 函数功能：SARADC相关寄存器恢复到上电默认值
 * 入口参数：None
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *--------------------------------------------*/ 
void SARADC_DeInit(void)
{
	RCC_APBPeriphResetCmd(RCC_APBPeriph_SARADC, ENABLE);
    RCC_APBPeriphResetCmd(RCC_APBPeriph_SARADC, DISABLE);
}
/*-----------------------------
 * 函数功能：SARADC初始化
 * 入口参数：SARADC_InitStruct: pointer to a SARADC_InitStruct structure that
 *           contains the configuration information for the specified SARADC peripheral.
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：None
 * 作者    ：
 *------------------------------*/ 
void SARADC_Init(SARADC_InitTypeDef* SARADC_InitStruct)
{
	
	SARADC_BufferConfig(SARADC_InitStruct->SARADC_BufMode,SARADC_InitStruct->SARADC_BufPhase);
    SARADC_BufferCmd(SARADC_InitStruct->SARADC_BufEN);
	
    SARADC_ChannelConfig(SARADC_InitStruct->SARADC_Channel);
	
	SARADC_SARCLKConfig(SARADC_InitStruct-> SARADC_SARCLK);
    SARADC_ReadyTimeConfig(SARADC_InitStruct-> SARADC_ReadyTime);
    SARADC_SampleTimeConfig(SARADC_InitStruct-> SARADC_SampleTime);	
	
	SARADC_CompCapCmd(SARADC_InitStruct->SARADC_CompCap);
	SARADC_ContinuousModeCmd(SARADC_InitStruct->SARADC_ContinuousMode);
    SARADC_WaitModeCmd(SARADC_InitStruct->SARADC_WaitMode);	
    SARADC_OVR_LoseCurrentValueCmd(SARADC_InitStruct->SARADC_OVR_LoseCurrentValue);	
	SARADC_HighSpeedModeCmd(SARADC_InitStruct->SARADC_HighSpeedMode);

}

/*----------------------------------------
 * 函数功能：使能SARADC功能模块
 * 入口参数：NewState: ENABLE或者DISABLE
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *----------------------------------------*/ 
void SARADC_Cmd(FunctionalState NewState)
{
	/* Check the parameters */
	assert_param(IS_FUNCTIONAL_STATE(NewState));
	
	if (NewState != DISABLE)
	{

		SARADC->CR0 |= SARADC_CR0_SAR_ADC_EN;
	}
	else
	{
		SARADC->CR0 &= ~SARADC_CR0_SAR_ADC_EN;
	}
		
}
/*-----------------------------
 * 函数功能：SARADC开始转换
 * 入口参数：NewState: ENABLE或者DISABLE
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *------------------------------*/ 
void SARADC_ConversionCmd(FunctionalState NewState)
{
	/* Check the parameters */
	assert_param(IS_FUNCTIONAL_STATE(NewState));
	
	if (NewState != DISABLE)
	{

		SARADC->CR0 |= SARADC_CR0_SAREN;
	}
	else
	{
		SARADC->CR0 &= ~SARADC_CR0_SAREN;
	}
}

/*----------------------------------------
 * 函数功能：比较器电容选择使能
 * 入口参数：NewState: ENABLE或者DISABLE
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *----------------------------------------*/ 
void SARADC_CompCapCmd(FunctionalState NewState)
{
	/* Check the parameters */
	assert_param(IS_FUNCTIONAL_STATE(NewState));
	
	if (NewState != DISABLE)
	{

		SARADC->CR2 |= SARADC_CR2_SARCONF1;
	}
	else
	{
		SARADC->CR2 &= ~SARADC_CR2_SARCONF1;
	}
		
}

/*--------------------------------------------
 * 函数功能：配置SARADC的采样时钟
 * 入口参数：SARADC_SARCLK: SARADC的采样时钟可配置为SARADC_SARCLK_IHRC_DIV256,SARADC_SARCLK_IHRC_DIV128,SARADC_SARCLK_IHRC_DIV64\
 *           SARADC_SARCLK_IHRC_DIV32,SARADC_SARCLK_IHRC_DIV16,SARADC_SARCLK_IHRC_DIV8,SARADC_SARCLK_IHRC_DIV4,SARADC_SARCLK_IHRC_DIV2
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *--------------------------------------------*/ 
void SARADC_SARCLKConfig(SARADCCLK_TypeDef SARADC_SARCLK)
{
	assert_param(IS_SARADC_CLK(SARADC_SARCLK));
	uint16_t tmpreg=0;
	tmpreg=SARADC->CR3&0x03f8;
	tmpreg|=SARADC_SARCLK;
	SARADC->CR3=tmpreg;
}
/*----------------------------------------
 * 函数功能：配置SARADC的准备时间
 * 入口参数：SARADC_ReadyTime: SARADC准备时间可选择为 SARADC_ReadyTime_128SARCLK,SARADC_ReadyTime_64SARCLK\
 *           SARADC_ReadyTime_32SARCLK,SARADC_ReadyTime_16SARCLK
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *----------------------------------------*/ 
void SARADC_ReadyTimeConfig(SARADCReadyTime_TypeDef SARADC_ReadyTime)
{
	assert_param(IS_SARADC_ReadyTime(SARADC_ReadyTime));
	uint16_t tmpreg=0;
	tmpreg=SARADC->CR3&0x033f;
	tmpreg|=SARADC_ReadyTime<<6;

	SARADC->CR3=tmpreg;
}
/*----------------------------------------
 * 函数功能：配置SARADC转换时的采样周期
 * 入口参数：SARADC_SampleTime: 采样时钟周期可配置为 SARADC_SampleTime_4SARCLK,SARADC_SampleTime_8SARCLK,.SARADC_SampleTime_16SARCLK\
 *           SARADC_SampleTime_32SARCLK,SARADC_SampleTime_64SARCLK,SARADC_SampleTime_128SARCLK,SARADC_SampleTime_256SARCLK,SARADC_SampleTime_512SARCLK
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *----------------------------------------*/ 
void SARADC_SampleTimeConfig(SARADCSampleTime_TypeDef SARADC_SampleTime)
{
	assert_param(IS_SARADC_SampleTime(SARADC_SampleTime));
	uint16_t tmpreg=0;
	tmpreg=SARADC->CR3&0x03c7;
	tmpreg|=SARADC_SampleTime<<3;
	SARADC->CR3=tmpreg;
}
/*----------------------------------------
 * 函数功能：使能SARADC工作于连续还是单个模式
 * 入口参数：NewState: ENABLE或者DISABLE
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *----------------------------------------*/ 
void SARADC_ContinuousModeCmd(FunctionalState NewState)
{
	/* Check the parameters */
	assert_param(IS_FUNCTIONAL_STATE(NewState));
	
	if(NewState != DISABLE)
	{
		SARADC->CR2 |= SARADC_CR2_SARCONF4;
	}
	else
	{
		SARADC->CR2 &= ~SARADC_CR2_SARCONF4;
	}

}

/*-------------------------------------------------------
 * 函数功能：使能SARADC工作在WAIT模式下
 * 入口参数：NewState: ENABLE或者DISABLE
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *-------------------------------------------------------*/ 
void SARADC_WaitModeCmd(FunctionalState NewState)
{
	/* Check the parameters */
	assert_param(IS_FUNCTIONAL_STATE(NewState));
	
	if(NewState != DISABLE)
	{
		SARADC->CR2 |= SARADC_CR2_WAIT;
	}
	else
	{
		SARADC->CR2 &= ~SARADC_CR2_WAIT;
	}
	
}

/*-----------------------------------------------------------
 * 函数功能：使能SARADC转换结果溢出时，是否舍弃当前值
 * 入口参数：NewState: ENABLE或者DISABLE
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *-----------------------------------------------------------*/ 	
void SARADC_OVR_LoseCurrentValueCmd(FunctionalState NewState)
{
	/* Check the parameters */
	assert_param(IS_FUNCTIONAL_STATE(NewState));
	
	if(NewState != DISABLE)
	{
		SARADC->CR2 |= SARADC_CR2_DROP;
	}
	else
	{
		SARADC->CR2 &= ~SARADC_CR2_DROP;
	}	
	
}

/*------------------------------------------------------
 * 函数功能：使能SARADC工作于高速模式
 * 入口参数：NewState: ENABLE或者DISABLE
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *------------------------------------------------------*/ 	
void SARADC_HighSpeedModeCmd(FunctionalState NewState)
{
	/* Check the parameters */
	assert_param(IS_FUNCTIONAL_STATE(NewState));
	
	if (NewState!= DISABLE)
	{

		SARADC->CR2 |= SARADC_CR2_SARI;
	}
	else
	{
		SARADC->CR2 &= ~SARADC_CR2_SARI;
	}	
	
}

/*--------------------------------------
 * 函数功能：SARADC Buffer设置
 * 入口参数：SARADC_BufMode,SARADC_BufPhase
 *			 SARADC_BufMode: SARADC Buffer 工作模式可选择为SARADC_BufMode_LowSpeed,SARADC_BufMode_HighSpeed
 *			 SARADC_BufPhase: SAR Buffer相位可选择为 SARADC_BufPhase_N,SARADC_BufPhase_P
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *--------------------------------------*/
void SARADC_BufferConfig(SARADCBufMode_TypeDef SARADC_BufMode,SARADCBufPhase_TypeDef SARADC_BufPhase)
{
	/* Check the parameters */
	assert_param(IS_SARADC_BufMode(SARADC_BufMode));
	assert_param(IS_SARADC_BufPhase(SARADC_BufPhase));
	
	uint8_t tmpreg=0;
	tmpreg=SARADC->CR4&0x3D;
	
	tmpreg|=SARADC_BufMode<<6;
	tmpreg|=SARADC_BufPhase<<1;	
	SARADC->CR4=tmpreg;	
}

/*-----------------------------------------
 * 函数功能：SARADC Buffer使能
 * 入口参数：NewState: ENABLE或者DISABLE
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *-----------------------------------------*/  
void SARADC_BufferCmd(FunctionalState NewState)
{
	/* Check the parameters */
	assert_param(IS_FUNCTIONAL_STATE(NewState));
	
	if (NewState != DISABLE)
	{
		SARADC->CR4 |= SARADC_CR4_SARBUF_EN;
	}
	else
	{
		SARADC->CR4 &= ~SARADC_CR4_SARBUF_EN;
	}		
}

/*----------------------------------------
 * 函数功能：配置SARADC信号输入通道
 * 入口参数：SARADC_Channel: SARADC信号输入通道可选择为 SARADC_Channel_A0，SARADC_Channel_A1，SARADC_Channel_A2\
 *           SARADC_Channel_A3,SARADC_Channel_A4,SARADC_Channel_A5,SARADC_Channel_A6,SARADC_Channel_A7\
 *           SARADC_Channel_DAO,SARADC_Channel_P04,SARADC_Channel_P03,SARADC_Channel_P02,SARADC_Channel_IAOUTP\
 *           SARADC_Channel_IAOUTN,SARADC_Channel_VSS,SARADC_Channel_AVDDR
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *----------------------------------------*/ 
void SARADC_ChannelConfig(uint8_t SARADC_Channel)                                                        
{
	/* Check the parameters */
	assert_param(IS_SARADC_Channel(SARADC_Channel));
	
	uint8_t tmpreg=0;
	tmpreg=SARADC->CR4&0x43;
	
	tmpreg|=SARADC_Channel<<0;
	SARADC->CR4=tmpreg;
	
}

/*-----------------------------
 * 函数功能：停止SARADC转换
 * 入口参数：NewState: ENABLE或者DISABLE
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *------------------------------*/ 
void SARADC_StopConversionCmd(FunctionalState NewState)                
{	
    /* Check the parameters */
	assert_param(IS_FUNCTIONAL_STATE(NewState));
	
	if (NewState != DISABLE)
	{

		SARADC->CR1 |= SARADC_CR1_SAR_RST;
	}
	else
	{
		SARADC->CR1 &= ~SARADC_CR1_SAR_RST;
	}
	
}


/*--------------------------------------
 * 函数功能：使能SARADC相关的中断
 * 入口参数：SARADC_IT,NewState
 *			 SARADC_IT: SARADC_CONIE,SARADC_CALIE,SARADC_RDYIE,SARADC_OVRIE,SARADC_SAMPIE
 *           NewState: ENABLE或者DISABLE
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *--------------------------------------*/  
void SARADC_ITConfig(uint8_t SARADC_IT, FunctionalState NewState)        
{
	/* Check the parameters */
	assert_param(IS_SARADC_ITSource(SARADC_IT));	
	assert_param(IS_FUNCTIONAL_STATE(NewState));	
	
	if (NewState != DISABLE)
	{
		SARADC->CR5 |= SARADC_IT;
	}
	else
	{
		SARADC->CR5 &= ~SARADC_IT;
	}	
} 
 
/*---------------------------------------
 * 函数功能：获取SARADC标志位状态
 * 入口参数：SARADC_IT: SARADC_CONIE,SARADC_CALIE,SARADC_RDYIE,SARADC_OVRIE,SARADC_SAMPIE
 * 出口参数：None
 * 返回值  ：SARADC标志位状态 bitstatus
 * 编写日期：None
 * 作者    ：
 *---------------------------------------*/  
ITStatus SARADC_GetITStatus(uint8_t SARADC_IT)
{
	/* Check the parameters */
	assert_param(IS_SARADC_ITSource(SARADC_IT));
	ITStatus bitstatus = RESET;

	if(SARADC->SR&SARADC_IT)
	{
		bitstatus =SET;
	}
	else
	{
		bitstatus =RESET;		
	}
	return bitstatus;
} 

/*--------------------------------------------
 * 函数功能：清零SARADC标志位
 * 入口参数：SARADC_IT: SARADC_CONIE,SARADC_CALIE,SARADC_RDYIE,SARADC_OVRIE,SARADC_SAMPIE
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *-------------------------------------------*/  
void SARADC_ClearITStatus(uint8_t SARADC_IT)
{
	/* Check the parameters */
	assert_param(IS_SARADC_ITSource(IT)(SARADC_IT));
	
	SARADC->SR|=SARADC_IT;
}

/*-------------------------------------
 * 函数功能：获取SARADC转换数据
 * 入口参数：None
 * 出口参数：None
 * 返回值  ：SARADC转换数据
 * 编写日期：
 * 作者    ：
 *-------------------------------------*/ 
uint16_t SARADC_GetConversionValue(void)
{	
	return (SARADC->DR);	
}


/****************************END OF FILE****************************/